package secondBrush.doubles;

import java.util.ArrayList;
import java.util.Stack;

public class E09Leetcode0207 {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Stack<ListNode> stackA = new Stack<>();
        Stack<ListNode> stackB = new Stack<>();
        while (headA != null) {
            stackA.add(headA);
            headA = headA.next;
        }
        while (headB != null) {
            stackB.add(headB);
            headB = headB.next;
        }
        ArrayList<ListNode> list = new ArrayList<>();

        while (true) {
            if (stackB.isEmpty()) {
                break;
            }
            if (stackA.isEmpty()) {
                break;
            }
            ListNode popB = stackB.pop();
            ListNode popA = stackA.pop();
            if (popB == popA) {
                list.add(popA);
            }

        }

        if (list.isEmpty()) {
            return null;
        }

        return list.get(list.size() - 1);



    }


    //让两个链表再同一起点再开始比较
    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != null) { // 求链表A的长度
            lenA++;
            curA = curA.next;
        }
        while (curB != null) { // 求链表B的长度
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头，lenA为其长度
        if (lenB > lenA) {
            //1. swap (lenA, lenB);
            int tmpLen = lenA;
            lenA = lenB;
            lenB = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上（末尾位置对齐）
        while (gap-- > 0) {
            curA = curA.next;
        }
        // 遍历curA 和 curB，遇到相同则直接返回
        while (curA != null) {
            if (curA == curB) {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }

    public ListNode getIntersectionNode3(ListNode headA, ListNode headB) {
        ListNode A = headA;
        ListNode B = headB;
        while (A != B) {
            A = A != null ? A.next : headB;
            B = B != null ? B.next : headA;
        }

        return A;
    }



    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    public static void main(String[] args) {
        ListNode a1 = new ListNode(1);
        ListNode b1 = new ListNode(1);
        ListNode b2 = new ListNode(2);
        b1.next = b2;
        E09Leetcode0207 e09Leetcode0207 = new E09Leetcode0207();
        e09Leetcode0207.getIntersectionNode3(a1, b1);


    }
}
